/*
 * Description: 用来缓存所有的调用，当调用返回时，会从缓存中查找对应的调用。
 */
#ifndef GUEST_LINK_CALL_RECORDS_CACHE
#define GUEST_LINK_CALL_RECORDS_CACHE

#include <map>
#include <mutex>
#include <memory>
#include <atomic>
#include "call_record.h"
#include "guest2host.pb.h"

namespace COMMON {
class CallRecordsCache {
public:
    CallRecordsCache() = default;
    ~CallRecordsCache();
    /**
     * 添加一个调用，需要传入一个唯一ID，以及调用相关信息，
     * 比如函数ID，参数。
     */
    void AddCallRecord(uint32_t callID, google::protobuf::MessageLite *result);
    /**
     * 挂起一个调用，需要传入唯一ID。
     */
    int WaitForResponse(uint32_t callID);
    /**
     * 唤醒一个调用，需要传入唯一ID。
     */
    void WakeUp(uint32_t callID);
    /**
     * 唤醒全部调用，比如连接断开时。
     */
    void WakeUpAll();
    /**
     * 把返回值传递给一个调用，传包含了唯一ID的buffer即可。
     * 内部会在返回值放置好之后，唤醒调用。
     */
    void SetResult(const Guest::protobuf::link::Result &result);
    /**
     * 删除一个调用，需要传入唯一ID。
     */
    void RemoveCallRecord(uint32_t callID);
private:
    std::map<uint32_t, std::unique_ptr<CallRecord>> m_caches = {};
    std::mutex m_mutex = {};
    std::atomic<uint32_t> waitNum{0};
};
}
#endif // GUEST_LINK_CALL_RECORDS_CACHE
